package com.general.framework.core.lang;

import com.general.framework.core.exception.Ex;

import java.util.Collection;
import java.util.Map;

/**
 * 断言工具类，用于断言程序中的参数，确保参数的可用性，避免NPE
 * @author leejean
 */
public abstract class Check {

    /**
     * 断言对象为null
     *
     * @param object  被断言的对象
     * @param message 不符合断言要抛出的异常消息
     * @param params  不符合断言要抛出的异常消息参数
     */
    public static void isNull(final Object object, final String message, final Object... params) {
        if (object != null) {
            throw Ex.violation(message, params);
        }
    }

    /**
     * 断言对象不为null
     *
     * @param object  被断言的对象
     * @param message 不符合断言要抛出的异常消息
     * @param params  不符合断言要抛出的异常消息参数
     */
    public static void notNull(final Object object, final String message, final Object... params) {
        if (object == null) {
            throw Ex.violation(message, params);
        }
    }

    /**
     * 断言对象不为null 不为 0
     *
     * @param number  被断言的数字
     * @param message 不符合断言要抛出的异常消息
     * @param params  不符合断言要抛出的异常消息参数
     */
    public static void notNullOrZero(final Number number, final String message, final Object... params) {
        if (number == null || number.intValue() == 0) {
            throw Ex.violation(message, params);
        }
    }

    /**
     * 断言String对象不为空
     *
     * @param object  被断言的对象
     * @param message 不符合断言要抛出的异常消息
     * @param params  不符合断言要抛出的异常消息参数
     */
    public static void hasText(final String object, final String message, final Object... params) {
        if (Strings.isBlank(object)) {
            throw Ex.violation(message, params);
        }
    }


    /**
     * 断言集合对象不为空
     *
     * @param object  被断言的对象
     * @param message 不符合断言要抛出的异常消息
     * @param params  不符合断言要抛出的异常消息参数
     */
    public static void notEmpty(final Collection object, final String message, final String... params) {
        if (object == null || object.isEmpty()) {
            throw Ex.violation(message, params);
        }
    }

    /**
     * 断言Map对象不为空
     *
     * @param object  被断言的对象
     * @param message 不符合断言要抛出的异常消息
     * @param params  不符合断言要抛出的异常消息参数
     */
    public static void notEmpty(final Map object, final String message, final String... params) {
        if (object == null || object.isEmpty()) {
            throw Ex.violation(message, params);
        }
    }

    /**
     * 断言数组对象不为空
     *
     * @param array   被断言的对象
     * @param message 不符合断言要抛出的异常消息
     * @param params  不符合断言要抛出的异常消息参数
     */
    public static void notEmpty(final Object[] array, final String message, final String... params) {
        if (array == null || array.length == 0) {
            throw Ex.violation(message, params);
        }
    }

    /**
     * 断言字符串不为空
     * @param str   被断言的字符串
     * @param message 不符合断言要抛出的异常消息
     * @param params  不符合断言要抛出的异常消息参数
     */
    public static void notEmpty(final String str, final String message, final String... params) {
        if (Strings.isEmpty(str)) {
            throw Ex.violation(message, params);
        }
    }

    /**
     * 断言某字符串为手机格式
     *
     * @param object  被断言的对象
     * @param message 不符合断言要抛出的异常消息
     * @param params  不符合断言要抛出的异常消息参数
     */
    public static void mobile(final String object, final String message, final String... params) {
        if (!Strings.isMobile(object)) {
            throw Ex.violation(message, params);
        }
    }

    /**
     * 密码校验
     *
     * @param password
     * @param message
     * @param params
     */
    public static void password(String password, final String message, final Strings... params) {
        final String regex = "[a-zA-Z0-9.!@#$%^&*_-]{6,18}";
        boolean b = password.matches(regex);
        if (!b) {
            throw Ex.violation(message, params);
        }
    }

    /**
     * url检验
     *
     * @param url
     * @param message
     * @param params
     */
    public static void url(String url, final String message, final Strings... params) {
        if (!Strings.isUrl(url)) {
            throw Ex.violation(message, params);
        }
    }

    /**
     * 身份证号码检验
     *
     * @param idCardNum
     * @param message
     * @param params
     */
    public static void idCard(String idCardNum, final String message, final Strings... params) {
        if (!Strings.isIdCardNum(idCardNum)) {
            throw Ex.violation(message, params);
        }
    }

    /**
     * 断言不为False
     * @param bool  被断言的对象
     * @param message 不符合断言要抛出的异常消息
     * @param params  不符合断言要抛出的异常消息参数
     */
    public static void notFalse(final Boolean bool, final String message, final Object... params) {
        if (!bool) {
            throw Ex.violation(message, params);
        }
    }
    /**
     * 断言不为True
     * @param bool  被断言的对象
     * @param message 不符合断言要抛出的异常消息
     * @param params  不符合断言要抛出的异常消息参数
     */
    public static void notTrue(final Boolean bool, final String message, final Object... params) {
        if (bool) {
            throw Ex.violation(message, params);
        }
    }

}
